// ----------------------------------------------------------------------------
// chunk.h
// ----------------------------------------------------------------------------
/*
 Description:
 チャンクデータ構造を作成するためのデータ構造.
 
 このデータ構造体はデータオーサリング/コンバート時に利用することを想定しているため、
 現在のところカスタムアロケータによるメモリ管理を提供しない. 
 */
#pragma once
#include <fw/base/core/stdinteger.h>
#include <fw/base/core/noncopyable.h>

#define FW_CHUNK_ID(a,b,c,d) ((((uint32_t)a)<<0)|(((uint32_t)b)<<8)|(((uint32_t)c)<<16)|(((uint32_t)d)<<24))

namespace fw
{
	class Chunk : private NonCopyable
	{
	private:
		uint32_t	m_id;
		uint32_t	m_dataSize;
		const char*	m_data;
		Chunk*		m_sibling;
		Chunk*		m_child;
		int			m_childCount;
		
	public:
		Chunk(uint32_t id)
		: m_id			(id)
		, m_dataSize	(0)
		, m_data		(nullptr)
		, m_sibling		(nullptr)
		, m_child		(nullptr)
		, m_childCount	(0)
		{
		}

		Chunk(uint32_t id, const char* data, uint32_t dataSize)
		: m_id			(id)
		, m_dataSize	(dataSize)
		, m_data		(data)
		, m_sibling		(nullptr)
		, m_child		(nullptr)
		, m_childCount	(0)
		{
		}
		
		~Chunk();
		
		const char*		GetData() const			{ return m_data; }
		const uint32_t	GetDataSize() const		{ return m_dataSize; }
		const uint32_t	GetID() const			{ return m_id; }
		const Chunk*	GetSibling() const		{ return m_sibling; }
		const Chunk*	GetChild() const		{ return m_child; }
		int				GetChildCount() const	{ return m_childCount; }
		
		const Chunk* FindChild(uint32_t id) const;
		
		Chunk* AddChild(Chunk* chunk);
		
	}; // class Chunk
	
} // namespace fw


